package org.raymond.iworks.study.basic.thread.semaphore;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Semaphore;

@Slf4j
public class Demo1 {
    // 从概念上讲,信号量维护一组许可.在获得许可之前,如果有必要,每个区块都将获得许可,然后将其获取.
    // 每次释放都会增加一个许可证,可能会释放一个阻塞的收购方.
    // 但是,没有使用实际的许可证对象;信号量只是保留可用数量的计数,并相应地进行操作.
    // 信号量通常用于限制可以访问某些(物理或逻辑)资源的线程数量

    /**
     * 有限资源的并发控制：Semaphore可以限制对有限资源的并发访问，例如数据库连接池或线程池中的资源管理。
     * 控制并发线程数：Semaphore可以控制同时执行的线程数量，例如限制同时访问某个接口的请求数量。
     * 实现互斥锁：Semaphore可以用于实现互斥锁的功能，通过设置permits为1，保证同一时间只有一个线程可以访问临界区。
     * 控制任务流量：Semaphore可以限制任务的执行速率，例如限制某个任务在单位时间内的执行次数。
     *
     * @param args
     */
    public static void main(String[] args) {
        test1();
    }

    public static void test1(){
        Semaphore semaphore = new Semaphore(3);

        for(int i=0; i<10; i++){
            final int j = i;
            new Thread(()->{
                try {
                    log.info("尝试获取资源 {}", j);
                    semaphore.acquire();
                    log.info("得到资源 {}", j);
                    Thread.sleep(1000*1);
                } catch (InterruptedException e) {
                }finally {
                    log.info("释放资源 {}", j);
                    semaphore.release();
                }
            }).start();
        }
    }
}
